package com.linkgie.galaxyframework.utils.lang;

/**
 * 类路径；
 * 
 * 描述一个类路径的物理位置信息；
 * 
 * @author huanghaiquan
 *
 */
public class ClassPath {

	/**
	 * 字符串形式的类路径；
	 */
	private String classPath;

	/**
	 * 类路径对应的 URL 路径；
	 */
	private String url;

	/**
	 * 所在文件系统目录；
	 * <p>
	 * 当实际的类路径是文件系统的一个目录时，属性返回目录的完整路径；
	 * <p>
	 * 当实际的类路径是文件系统的一个文件时，属性返回该文件所在的目录的完整路径； <br>
	 * 如果实际的类路径是存在于 jar 包中时，属性返回的是 jar 文件所在目录的完整路径；
	 * <p>
	 */
	private String dir;

	/**
	 * 是否在一个 jar 文件中；
	 * 
	 * <p>
	 * 当实际的类路径是存在于 jar 包中时，返回 true ；
	 * <p>
	 * 当实际的类路径不在 jar 包中，而是文件系统的一个目录或者一个文件时，返回 false ；
	 */
	private boolean inJar;

	/**
	 * 文件路径；
	 * <p>
	 * 
	 * 当实际的类路径是存在于 jar 包中时，即 inJar 为 true ，属性返回 jar 文件的路径；
	 * <p>
	 * 当实际的类路径是文件系统的一个文件时，属性返回表示该文件的完整路径；
	 * <p>
	 * 当实际的类路径是文件系统的一个目录时，属性返回 null，此时通过 {@link #getDir()} 属性获得目录的完整路径；
	 * 
	 */
	private String file;
	
	/**
	 * 内部路径；
	 * <p>
	 * 仅当实际的类路径是存在于 jar 包中时，即 inJar 为 true ，此属性才有效，此时返回 classpath 在 jar 文件内部的路径；
	 */
	private String path;

	/**
	 * 字符串形式的类路径；
	 */
	public String getClassPath() {
		return classPath;
	}

	/**
	 * 类路径对应的 URL 路径；
	 */
	public String getUrl() {
		return url;
	}

	/**
	 * 所在文件系统目录；
	 * <p>
	 * 当实际的类路径是文件系统的一个目录时，属性返回目录的完整路径；
	 * <p>
	 * 当实际的类路径是文件系统的一个文件时，属性返回该文件所在的目录的完整路径； <br>
	 * 如果实际的类路径是存在于 jar 包中时，属性返回的是 jar 文件所在目录的完整路径；
	 * <p>
	 */
	public String getDir() {
		return dir;
	}

	/**
	 * 是否在一个 jar 文件中；
	 * 
	 * <p>
	 * 当实际的类路径是存在于 jar 包中时，返回 true ；
	 * <p>
	 * 当实际的类路径不在 jar 包中，而是文件系统的一个目录或者一个文件时，返回 false ；
	 */
	public boolean isInJar() {
		return inJar;
	}

	/**
	 * 文件路径；
	 * 
	 * 如果 inJar 为 true，则返回值是 jar 文件的路径； 如果 inJar 为 false，且返回值不为空时，返回值是类路径表示的文件，但返回
	 * null 则表示类路径是目录，目录路径为 dir 属性表示；
	 * 
	 * @return
	 */
	public String getFile() {
		return file;
	}

	void setClassPath(String classPath) {
		this.classPath = classPath;
	}

	void setUrl(String url) {
		this.url = url;
	}

	void setDir(String dir) {
		this.dir = dir;
	}

	void setInJar(boolean inJar) {
		this.inJar = inJar;
	}

	void setFile(String file) {
		this.file = file;
	}

	/**
	 * 内部路径；
	 * <p>
	 * 仅当实际的类路径是存在于 jar 包中时，即 inJar 为 true ，此属性才有效，此时返回 classpath 在 jar 文件内部的路径；
	 */
	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}
}
